#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
改进版凯利公式计算器启动器打包脚本
功能说明：使用PyInstaller将launcher_improved.py打包成exe文件
作者：luohe
创建时间：2024-12-19
"""

import os
import sys
import subprocess
import shutil
from pathlib import Path

def check_pyinstaller():
    """检查PyInstaller是否已安装"""
    try:
        import PyInstaller
        print(f"✓ PyInstaller已安装，版本: {PyInstaller.__version__}")
        return True
    except ImportError:
        print("❌ PyInstaller未安装，正在安装...")
        try:
            subprocess.run([sys.executable, "-m", "pip", "install", "pyinstaller"], check=True)
            print("✓ PyInstaller安装成功")
            return True
        except subprocess.CalledProcessError:
            print("❌ PyInstaller安装失败")
            return False

def create_spec_file():
    """创建PyInstaller spec文件"""
    spec_content = '''# -*- mode: python ; coding: utf-8 -*-

a = Analysis(
    ['launcher_improved.py'],
    pathex=[],
    binaries=[],
    datas=[
        ('calculator.ico', '.'),  # 如果图标文件存在的话
    ],
    hiddenimports=[
        'streamlit',
        'plotly',
        'numpy',
        'pandas',
        'scipy',
        'matplotlib',
        'seaborn',
        'openpyxl',
        'xlsxwriter',
        'requests',
        'psutil',
        'tkinter',
        'threading',
        'webbrowser',
        'tempfile',
        'shutil'
    ],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
)
pyz = PYZ(a.pure)

exe = EXE(
    pyz,
    a.scripts,
    a.binaries,
    a.datas,
    [],
    name='凯利公式计算器启动器-改进版',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,  # 不显示控制台窗口
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon='calculator.ico' if os.path.exists('calculator.ico') else None,
)
'''
    
    with open('launcher_improved.spec', 'w', encoding='utf-8') as f:
        f.write(spec_content)
    
    print("✓ launcher_improved.spec文件已创建")

def create_install_script():
    """创建安装脚本"""
    install_content = '''@echo off
chcp 65001 > nul
echo ====================================
echo 凯利公式计算器启动器 - 改进版安装
echo ====================================
echo.

echo 正在检查Python环境...
python --version >nul 2>&1
if errorlevel 1 (
    echo ❌ 未检测到Python环境，请先安装Python 3.7+
    echo 下载地址: https://www.python.org/downloads/
    pause
    exit /b 1
)

echo ✓ Python环境检测成功
echo.

echo 正在安装必要的依赖包...
python -m pip install --upgrade pip
python -m pip install streamlit plotly numpy pandas scipy matplotlib seaborn openpyxl xlsxwriter requests psutil

if errorlevel 1 (
    echo ❌ 依赖包安装失败，请检查网络连接
    pause
    exit /b 1
)

echo ✓ 依赖包安装成功
echo.
echo ====================================
echo 安装完成！现在可以运行exe文件了
echo ====================================
pause
'''
    
    with open('install_improved.bat', 'w', encoding='utf-8') as f:
        f.write(install_content)
    
    print("✓ install_improved.bat安装脚本已创建")

def create_readme():
    """创建README文件"""
    readme_content = '''# 凯利公式计算器启动器 - 改进版

## 📋 版本特性

### ✨ 改进版新特性
- ✅ **内嵌所有依赖文件** - 无需外部streamlit_kelly_calculator.py和requirements.txt文件
- ✅ **隐藏控制台窗口** - 运行时不显示黑色控制台窗口
- ✅ **控制台输出重定向** - 所有输出信息显示在程序界面内
- ✅ **临时文件管理** - 自动创建和清理临时文件
- ✅ **更好的错误处理** - 完善的异常处理和用户提示
- ✅ **进程监控** - 实时显示Streamlit服务状态

## 🚀 使用说明

### 方式一：直接运行exe（推荐）
1. 双击运行 `凯利公式计算器启动器-改进版.exe`
2. 程序会自动检查和安装依赖包
3. 点击"🚀 启动计算器"按钮
4. 程序会自动打开浏览器访问计算器

### 方式二：手动安装依赖后运行
1. 运行 `install_improved.bat` 安装依赖包
2. 双击运行 `凯利公式计算器启动器-改进版.exe`
3. 点击"🚀 启动计算器"按钮

## 📦 文件说明

- `凯利公式计算器启动器-改进版.exe` - 主程序文件（已内嵌所有依赖）
- `install_improved.bat` - 依赖包安装脚本（可选使用）
- `calculator.ico` - 程序图标文件（可选）
- `README_IMPROVED.md` - 本说明文件

## 🔧 系统要求

- Windows 7/8/10/11
- Python 3.7+ （程序会自动检测和提示安装）
- 网络连接（用于安装依赖包）

## 🎯 功能特点

### 启动器功能
- 🚀 一键启动Streamlit计算器
- 🌐 自动打开浏览器
- ⏹️ 安全停止服务
- 📊 实时状态监控
- 🔄 自动依赖管理

### 计算器功能
- 📈 凯利公式最优投资比例计算
- 📊 可视化图表展示
- 🎯 多种投资策略对比
- 💡 智能投资建议
- 📋 详细风险分析

## ❓ 常见问题

### Q: 程序启动后没有反应？
A: 请检查是否已安装Python环境，可运行install_improved.bat安装依赖。

### Q: 浏览器没有自动打开？
A: 手动打开浏览器访问 http://localhost:8501

### Q: 提示端口被占用？
A: 关闭其他可能占用8501端口的程序，或重启计算机。

### Q: 依赖包安装失败？
A: 检查网络连接，或使用国内镜像源：
```
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple streamlit plotly numpy pandas
```

## 🔄 版本更新

### v2.0 - 改进版 (2024-12-19)
- 内嵌所有依赖文件
- 隐藏控制台窗口
- 控制台输出重定向
- 临时文件自动管理
- 更好的错误处理

### v1.0 - 基础版
- 基本启动器功能
- 外部文件依赖

## 📞 技术支持

如遇到问题，请检查：
1. Python环境是否正确安装
2. 网络连接是否正常
3. 防火墙是否阻止程序运行
4. 杀毒软件是否误报

---

**开发者**: luohe  
**创建时间**: 2024-12-19  
**版本**: 2.0 改进版
'''
    
    with open('README_IMPROVED.md', 'w', encoding='utf-8') as f:
        f.write(readme_content)
    
    print("✓ README_IMPROVED.md说明文件已创建")

def build_exe():
    """构建exe文件"""
    print("\n开始构建exe文件...")
    print("=" * 50)
    
    try:
        # 清理之前的构建文件
        if os.path.exists('build'):
            shutil.rmtree('build')
            print("✓ 清理build目录")
        
        if os.path.exists('dist'):
            shutil.rmtree('dist')
            print("✓ 清理dist目录")
        
        # 执行PyInstaller
        cmd = ['pyinstaller', 'launcher_improved.spec', '--clean']
        print(f"执行命令: {' '.join(cmd)}")
        
        result = subprocess.run(cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("\n✓ exe文件构建成功！")
            print(f"输出目录: {os.path.abspath('dist')}")
            
            # 检查生成的文件
            exe_path = os.path.join('dist', '凯利公式计算器启动器-改进版.exe')
            if os.path.exists(exe_path):
                file_size = os.path.getsize(exe_path) / (1024 * 1024)  # MB
                print(f"exe文件大小: {file_size:.1f} MB")
            
            return True
        else:
            print("\n❌ exe文件构建失败！")
            print("错误信息:")
            print(result.stderr)
            return False
    
    except Exception as e:
        print(f"\n❌ 构建过程出错: {str(e)}")
        return False

def main():
    """主函数"""
    print("凯利公式计算器启动器 - 改进版打包脚本")
    print("=" * 50)
    
    # 检查必要文件
    if not os.path.exists('launcher_improved.py'):
        print("❌ 找不到launcher_improved.py文件")
        return False
    
    print("✓ launcher_improved.py文件存在")
    
    # 检查PyInstaller
    if not check_pyinstaller():
        return False
    
    # 创建相关文件
    create_spec_file()
    create_install_script()
    create_readme()
    
    # 构建exe
    success = build_exe()
    
    if success:
        print("\n" + "=" * 50)
        print("🎉 打包完成！")
        print("\n生成的文件:")
        print("- dist/凯利公式计算器启动器-改进版.exe (主程序)")
        print("- install_improved.bat (依赖安装脚本)")
        print("- README_IMPROVED.md (使用说明)")
        print("\n✨ 改进版特性:")
        print("- ✅ 内嵌所有依赖文件")
        print("- ✅ 隐藏控制台窗口")
        print("- ✅ 控制台输出重定向到程序界面")
        print("- ✅ 自动临时文件管理")
        print("- ✅ 更好的错误处理")
    else:
        print("\n❌ 打包失败，请检查错误信息")
    
    return success

if __name__ == "__main__":
    main()